﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using l1cs.server.model.Instance;
using l1cs.server.model;
using l1cs.server.serverpackets;
using l1cs.server.datatables;

namespace l1cs.server.clientpackets
{
    public class C_BanClan : ClientBasePacket
    {
        private const String _C_BAN_CLAN = "[C] C_BanClan";
        private static Logger _log = Logger.getLogger( typeof( C_BanClan ).FullName );

        public C_BanClan( byte[] abyte0, ClientThread clientthread )
            : base( abyte0 )
        {
            String s = readS();

            L1PcInstance pc = clientthread.getActiveChar();
            L1Clan clan = L1World.getInstance().getClan( pc.getClanname() );
            if ( clan != null )
            {
                String[] clanMemberName = clan.getAllMembers();
                int i;
                if ( pc.isCrown() && pc.getId() == clan.getLeaderId() )
                { // 君主、かつ、血盟主
                    for ( i = 0; i < clanMemberName.Length; i++ )
                    {
                        if ( string.Compare( pc.getName(), s, true ) == 0 )
                        { // 君主自身
                            return;
                        }
                    }
                    L1PcInstance tempPc = L1World.getInstance().getPlayer( s );
                    if ( tempPc != null )
                    { // オンライン中
                        if ( tempPc.getClanid() == pc.getClanid() )
                        { // 同じクラン
                            tempPc.setClanid( 0 );
                            tempPc.setClanname( "" );
                            tempPc.setClanRank( 0 );
                            tempPc.save(); // DBにキャラクター情報を書き込む
                            clan.delMemberName( tempPc.getName() );
                            tempPc.sendPackets( new S_ServerMessage( 238, pc
                                    .getClanname() ) ); // あなたは%0血盟から追放されました。
                            pc.sendPackets( new S_ServerMessage( 240, tempPc
                                    .getName() ) ); // %0があなたの血盟から追放されました。
                        }
                        else
                        {
                            pc.sendPackets( new S_ServerMessage( 109, s ) ); // %0という名前の人はいません。
                        }
                    }
                    else
                    { // オフライン中

                        L1PcInstance restorePc = CharacterTable.getInstance()
                                .restoreCharacter( s );
                        if ( restorePc != null
                                && restorePc.getClanid() == pc.getClanid() )
                        { // 同じクラン
                            restorePc.setClanid( 0 );
                            restorePc.setClanname( "" );
                            restorePc.setClanRank( 0 );
                            restorePc.save(); // DBにキャラクター情報を書き込む
                            clan.delMemberName( restorePc.getName() );
                            pc.sendPackets( new S_ServerMessage( 240, restorePc.getName() ) ); // %0があなたの血盟から追放されました。
                        }
                        else
                        {
                            pc.sendPackets( new S_ServerMessage( 109, s ) ); // %0という名前の人はいません。
                        }
                    }
                }
                else
                {
                    pc.sendPackets( new S_ServerMessage( 518 ) ); // この命令は血盟の君主のみが利用できます。
                }
            }
        }

        override
        public String getType()
        {
            return _C_BAN_CLAN;
        }
    }
}